﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

using J_FoundationClasses.Programacao;
/*
 * 
 * A classe é responsavel para representar um programa em linguagem de montador.
 * As operações relatos à persistência fazem parte da classe também.
 * 
 * Experimentos com Serialization não deram bons resultados:
 * - a classe base, DataTable, somente será serializada como XML, mesmo se o programador escolhe o binary formatter
 * - a serialização dos demais objetos para XML e tão complicado que a gravação/leitura convencional é superior
 * - uma vantagem da serialização é que o programador não se preocupa com os tipos das classes na deserialização. Mas, neste programa
 *   o programador já instancia objetos à base do tipo. Não custa mais fazer isso na leitura do arquivo.
 */

namespace Montador
{
    public class ProgMon
    {
        public static string Extension = "5mn";  // extensão padrão para arquivos fonte
        public static string FormulaMagica = "Montador-J5"; // identificação do conteúdo de arquivos
        public static uint VersaoFormato = 1;

        public readonly string NomeArquivo = null;
        public readonly string TipoProc;
        public readonly tblLinhas Linhas;

        public ProgMon(string prmProc)
        {
            // criar programa vazio
            TipoProc = prmProc;
            Linhas = new tblLinhas(TipoProc);
        }

        public ProgMon(BinaryReader brFonte)
        {
            // ler conteúdo do arquivo e criar o objeto

            NomeArquivo = (brFonte.BaseStream as FileStream).Name;

            string ss = brFonte.ReadString();
            if (ss != FormulaMagica) throw new ApplicationException("FormulaMagica inválida.");
            uint uu = brFonte.ReadUInt32();
            if (uu != VersaoFormato) throw new ApplicationException("VersaoFormato inválido");
            TipoProc = brFonte.ReadString();
            Linhas = new tblLinhas(brFonte, TipoProc);
        }
        public void Gravar(BinaryWriter bwFonte)
        {
            // gravar o conteúdo para arquivo arquivo
            bwFonte.Write(FormulaMagica);
            bwFonte.Write(VersaoFormato);
            bwFonte.Write(TipoProc);
            Linhas.Gravar(bwFonte);
        }

    }
}
